package qualomelhor.gwt.modules.client;

import java.util.ArrayList;

import qualomelhor.database.Comparacao;
import qualomelhor.database.ParametrosSistema;
import qualomelhor.database.ParametrosSistema.SiteHost;
import qualomelhor.database.Usuario;

import com.google.appengine.api.datastore.Blob;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.search.client.*;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class CriarComparacao implements EntryPoint {

	private RootPanel root;
	private TextBox txtBusca;
	private VerticalPanel vertPImages;
	private HorizontalPanel horPanelImg;
	private CheckBox[] listCkImg;
	private HorizontalPanel horPProsseguir;
	private ListBox listPerguntas;
	private TextBox txtPerguntaIntermed;
	private Label lbPerguntaFinal;
	private FileUpload upload;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private Usuario u;

	int currentRow;
	FlexTable resultsTable;

	@Override
	public void onModuleLoad() {
		System.out.println("Iniciando modulo...");
		root = RootPanel.get("divCadastro");
		root.clear();
		root.add(new Label("Busca:"));
		carregaFormTipoComparacao();
	}

	private void carregaFormQualAPergunta() {
		root.clear();
		root.add(new Label("Forme a pergunta:"));
		HorizontalPanel horP = new HorizontalPanel();
		root.add(horP);
		listPerguntas = new ListBox();
		listPerguntas.addItem("Qual o melhor", "0");
		listPerguntas.addItem("Qual a melhor", "1");
		listPerguntas.addItem("O que é melhor", "2");
		listPerguntas.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				lbPerguntaFinal.setText(listPerguntas.getItemText(listPerguntas.getSelectedIndex()) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBusca.getText().trim());
			}
		});
		horP.add(listPerguntas);

		txtPerguntaIntermed = new TextBox();
		txtPerguntaIntermed.addChangeHandler(new ChangeHandler() {
			@Override
			public void onChange(ChangeEvent event) {
				lbPerguntaFinal.setText(listPerguntas.getItemText(listPerguntas.getSelectedIndex()) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBusca.getText().trim());
			}
		});
		horP.add(txtPerguntaIntermed);

		txtBusca.setEnabled(false);
		horP.add(txtBusca);

		lbPerguntaFinal = new Label(listPerguntas.getItemText(0) + " " + txtPerguntaIntermed.getText().trim() + " " + txtBusca.getText().trim());
		root.add(lbPerguntaFinal);

		Button btnGravar = new Button("Gravar&gt;&gt;");
		root.add(btnGravar);
		btnGravar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {

				ArrayList<String> listEnderecoFoto = new ArrayList<String>(0);
				for (int i = 0; i < listCkImg.length; i++) {
					if (listCkImg[i].getValue()) {
						listEnderecoFoto.add(listCkImg[i].getTitle());
					}
				}

				if (!upload.getFilename().trim().equals("")) {
					listEnderecoFoto.add(upload.getFilename().trim());
				}

				gravaComparacao1Coisa(0L, txtBusca.getText(), listEnderecoFoto);
			}
		});
	}

	private void carregaFormTipoComparacao() {
		root.clear();
		VerticalPanel vert = new VerticalPanel();
		Label lb1 = new Label("Que tipo de comparação deseja criar?");
		vert.add(lb1);

		Button btnComp2Coisas = new Button("Comparação entre 2 coisas quaisquer");
		vert.add(btnComp2Coisas);
		btnComp2Coisas.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				//carregaFormComparacao2Coisas();
			}
		});

		Button btnComp3Coisas = new Button("Comparação entre 3 coisas quaisquer");
		vert.add(btnComp3Coisas);
		btnComp3Coisas.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				//carregaFormComparacao3Coisas();
			}
		});

		Button btnComp1Coisa = new Button("Opinião sobre algum método, produto ou alguma coisa qualquer");
		vert.add(btnComp1Coisa);
		btnComp1Coisa.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				carregaFormComparacao1Coisa();
			}
		});

		root.add(vert);
	}

	private void carregaFormComparacao1Coisa() {
		root.clear();

		VerticalPanel vertPanelMain = new VerticalPanel();
		HorizontalPanel horP = new HorizontalPanel();
		Label lb1 = new Label("Sobre o que você quer opinião:");
		horP.add(lb1);

		txtBusca = new TextBox();
		horP.add(txtBusca);

		Button btnBusca = new Button("OK");
		horP.add(btnBusca);
		btnBusca.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				buscaImagem (txtBusca.getText());				
			}
		});

		vertPanelMain.add(horP);

		root.add(vertPanelMain);
		vertPImages = new VerticalPanel();
		root.add(vertPImages);

	    horPanelImg = new HorizontalPanel();
	    root.add(horPanelImg);	
	}

	private void carregaFormComparacao2Coisa() {
		root.clear();

		VerticalPanel vertPanelMain = new VerticalPanel();
		HorizontalPanel horP = new HorizontalPanel();
		Label lb1 = new Label("Sobre o que você quer opinião:");
		horP.add(lb1);

		txtBusca = new TextBox();
		horP.add(txtBusca);

		Button btnBusca = new Button("OK");
		horP.add(btnBusca);
		btnBusca.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				buscaImagem (txtBusca.getText());				
			}
		});

		vertPanelMain.add(horP);

		root.add(vertPanelMain);
		vertPImages = new VerticalPanel();
		root.add(vertPImages);

	    horPanelImg = new HorizontalPanel();
	    root.add(horPanelImg);	
	}

	private void buscaImagem(final String busca) {
		resultsTable = new FlexTable();
	    SearchControlOptions options = new SearchControlOptions();
	    ImageSearch webSearch = new ImageSearch();
	    // Choose no HTML generation for quicker results.
	    webSearch.setNoHtmlGeneration();

	    for (int z = 0; z < ResultSetSize.values().length; z++) {
	    	System.out.println("Resultsize value: " + ResultSetSize.values()[z]);
	    }
	    webSearch.setResultSetSize(ResultSetSize.LARGE);
	    options.add(webSearch, ExpandMode.OPEN);
	    final SearchControl control = new SearchControl(options);

	    control.addSearchResultsHandler(new SearchResultsHandler() {
	    	public void onSearchResults(final SearchResultsEvent event) {

	    		final int pageNumber = event.getSearch().getCursor().getCurrentPageIndex();

	    		JsArray<? extends Result> results = event.getResults();
	    		System.out.println("número de resultados: " + results.length());
	    		System.out.println("número de paginas: " + event.getSearch().getCursor().getPages().length());
	    		System.out.println("Pagina atual: " + pageNumber);

	    		listCkImg = new CheckBox[results.length()];
	    		int i = 0;
	    		for (i = 0; i < results.length(); i++) {
	    			if (results.get(i).getResultClass().equals(ResultClass.IMAGE_SEARCH_RESULT)) {
	    				currentRow++;

	    				WebResult result = (WebResult) results.get(i);
	    				Image img = new Image(result.getUrl());
	    				img.setSize("100px", "100px");
	    				resultsTable.setWidget(0, i, img);
	    				listCkImg[i] = new CheckBox();
	    				listCkImg[i].setTitle(result.getUrl());
	    				listCkImg[i].addClickHandler(new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								boolean encontrado = false;
								for (int k = 0; k < listCkImg.length; k++) {
									if (listCkImg[k].getValue()) {
										encontrado = true;
										break;
									}
								}

								horPanelImg.setVisible(!encontrado);

								if (encontrado) {
									if (horPProsseguir == null) {
										horPProsseguir = new HorizontalPanel();
									}
									if (horPProsseguir.getWidgetCount() == 0) {
										Button btnProsseguir = new Button("Prosseguir&gt;&gt;");
										horPProsseguir.add(btnProsseguir);
										root.add(horPProsseguir);
										btnProsseguir.addClickHandler(new ClickHandler() {
											@Override
											public void onClick(ClickEvent event) {
												carregaFormQualAPergunta();
											}
										});
									}
								} else {
									if (upload.getFilename().equals("")) {
										root.remove(horPProsseguir);
										horPProsseguir = null;
									}
								}
							}
						});
	    				resultsTable.setWidget(1, i, listCkImg[i]);
	    			}
	    		}
	    		Button btnMaisResultados = new Button("Mais&gt;&gt;");
	    		btnMaisResultados.addClickHandler(new ClickHandler() {
					@Override
					public void onClick(ClickEvent ev) {
						event.getSearch().gotoPage(pageNumber + 1);
					}
				});
	    		resultsTable.setWidget(0, i, btnMaisResultados);
	    		if (horPanelImg.getWidgetCount() == 0) {
	    			horPanelImg.add(new Label("Use sua própria foto:"));
	    			upload = new FileUpload();
	    			upload.addChangeHandler(new ChangeHandler() {
	    				@Override
	    				public void onChange(ChangeEvent event) {
	    					Window.alert("selecionou arquivo!!");
	    				}
	    			});
	    			horPanelImg.add(upload);
	    		}
	    	}
	    });

	    vertPImages.clear();
	    vertPImages.add(new Label("Selecione as imagens que descrevem o item:"));
	    ScrollPanel scroll = new ScrollPanel(resultsTable);
	    scroll.setWidth("400px");
	    scroll.setHeight("150px");
	    vertPImages.add(scroll);

	    control.execute(busca);
	}

	private void gravaComparacao1Coisa(Long idUsuario, String nomeProduto, ArrayList<String> listEnderecoFoto) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Comparacao> callback = new AsyncCallback<Comparacao>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Comparacao comp) {
				if (comp == null) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					Window.Location.replace("/comparacao/" + comp.getPath(ParametrosSistema.SiteHost.SITE_QUAL_O_MELHOR));
				}
			}
		};
		System.out.println("Salvando comparacao: idUsuario: " + idUsuario + ", nomeProduto = " + nomeProduto + ", enderecoFoto.size = " + listEnderecoFoto.size());
		//serviceSupportSvc.gravaComparacao1Coisa(idUsuario, nomeProduto, listEnderecoFoto, new ArrayList<Blob>(0), SiteHost.valueOf((listPerguntas.getValue(listPerguntas.getSelectedIndex()))), txtPerguntaIntermed.getText(), callback);
	}
}